//
// 双向链表
// Created by 麻再挺 on 2021/1/28.
//

#ifndef DATA_STRUCTURE_C_DOUBLE_LINKED_LIST_H
#define DATA_STRUCTURE_C_DOUBLE_LINKED_LIST_H
#include <stdio.h>
#include <stdlib.h>
#include "./../constant.h"

// 定义数据类型
typedef int ElemType;

// 双向链表
typedef struct DLNode {
    ElemType data;
    struct DLNode *prior, *next;
} DLinkedList;

/**
 * 创建双向链表
 * @param list 链表
 * @return
 */
Status DLinked_List_Create(DLinkedList *list);

/**
 * 追加数据
 * @param list 链表
 * @param elem 数据
 * @return
 */
Status DLinked_List_Push(DLinkedList *list, ElemType elem);

/**
 * 插入数据
 * @param list 链表
 * @param i 索引
 * @param elem 数据
 * @return
 */
Status DLinked_List_Insert(DLinkedList *list, int i, ElemType elem);

/**
 * 将指向头结点的元素删除
 * @param list 列表
 * @return
 */
Status DLinked_List_Pop(DLinkedList *list);

/**
 * 删除指定索引数据
 * @param list 列表
 * @param i 索引
 * @return
 */
Status DLinked_List_Delete(DLinkedList *list, int i);

/**
 * 根据索引获取链表数据
 * @param list 链表
 * @param i 索引
 * @param node 数据
 * @return
 */
Status DLinked_List_Get_Elem(DLinkedList *list, int i, DLinkedList *node);

/**
 * 合并两个线性链表, 合并后将值赋值到第一个链表中
 * @param list1 待合并线性链表
 * @param list2 待合并线性链表
 * @return
 */
Status DLinked_List_Merge(DLinkedList *list1, DLinkedList *list2);

/**
 * 打印循环链表数据
 * @param list 链表
 */
void DLinked_List_Print(DLinkedList *list);


#endif //DATA_STRUCTURE_C_DOUBLE_LINKED_LIST_H
